/*
 * @Description:
 * @Author: jun.wu
 * @Date: 2022-09-21 14:17:01
 * @LastEditors: jun.wu
 * @LastEditTime: 2022-11-17 10:51:36
 */
import { getToken, setToken, removeToken, setTimeStamp } from "@/utils/auth";
import { login, getUserInfo, getUserDetailById } from "@/api/user";
import { resetRouter } from "@/router/index";

//状态
const state = {
  token: getToken(), //设置token为共享状态,初始化vuex的时候，先从缓存中读取
  userInfo: {},
};
//修改状态
const mutations = {
  setToken(state, token) {
    state.token = token; //数据给vuex
    //同步给缓存
    setToken(token);
  },
  removeToken(state) {
    state.token = null; //将vuex数据置空
    removeToken(); //清除缓存
  },
  // 设置用户信息
  setUserInfo(state, result) {
    state.userInfo = result;
    // state.userInfo = { ...result };这样也是响应式 浅拷贝
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {};
  },
};
//执行异步
const actions = {
  async login(context, data) {
    //调用api接口
    const result = await login(data); //拿到token
    context.commit("setToken", result); //设置token
    //登录成功存入时间戳
    setTimeStamp();
  },

  async getUserInfo(context) {
    const result = await getUserInfo();
    const baseInfo = await getUserDetailById(result.userId); //为了获取头像
    // const baseResult = { ...result, ...baseInfo };
    context.commit("setUserInfo", { ...result, ...baseInfo }); //将整个人的信息设置到用户的vuex数据中
    return { ...result, ...baseInfo }; //后期做权限的伏笔
  },

  //登出操作
  logout(context) {
    context.commit("removeToken"); //清除token
    context.commit("removeUserInfo"); //清除用户信息
    resetRouter(); //重置路由
    // vuex子模块调用子模块的action
    // 不加命名空间的子模块可以直接调用
    // 加了命名空间的context指的不是全局了
    // mutations名称 载荷payload 第三个参数{root:true}，调用根级的mutations或者actions
    context.commit("permission/setRoutes", [], { root: true });
  },
};
export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
